import { Inject, Provide, Config } from '@midwayjs/decorator';
import { BaseService, CoolCommException } from '@cool-midway/core';
import { Repository } from 'typeorm';
import { InjectEntityModel } from '@midwayjs/typeorm';
import * as _ from 'lodash';
import * as jwt from 'jsonwebtoken';
import { Context } from '@midwayjs/koa';
import { CacheManager } from '@midwayjs/cache';
import { DoupiaopiaoDouyinService } from './douyin';
import { DoupiaopiaoUserEntity } from '../entity/user';
import { DoupiaopiaoInvitationEntity } from '../entity/invitation';
/**
 * 登录
 */
@Provide()
export class DoupiaopiaoLoginService extends BaseService {
  @InjectEntityModel(DoupiaopiaoUserEntity)
  doupiaopiaoUserEntity: Repository<DoupiaopiaoUserEntity>;
  @Inject()
  doupiaopiaoDouyinService: DoupiaopiaoDouyinService;
  @Inject()
  cacheManager: CacheManager;
  @InjectEntityModel(DoupiaopiaoInvitationEntity)
  doupiaopiaoInvitationEntity: Repository<DoupiaopiaoInvitationEntity>;

  @Inject()
  ctx: Context;
  @Config('module.doupiaopiao')
  doupiaopiaoConfig;

  /**
   * 抖音登录
   */
  async douyinLogin(login) {
    const config = this.doupiaopiaoConfig;
    const { code, userinfo, shareUserId } = login;
    console.log(code, userinfo, '打印一下用户信息');

    try {
      // 获取用户openid
      const douyinRes = await this.doupiaopiaoDouyinService.code2Session(code);
      // 查询用户是否存在
      let user = await this.doupiaopiaoUserEntity.findOneBy({
        dyOpenid: douyinRes['openid'],
      });
      if (user) {
        if (user.id != shareUserId) {
          user.shareUserId = shareUserId;
        }
        if (shareUserId && user.id != shareUserId) {
          await this.doupiaopiaoInvitationEntity.delete({
            userId: user.id.toString(),
          });
          const inviter = await this.doupiaopiaoInvitationEntity.findOneBy({
            userId: shareUserId.toString(),
          });
          let user_level = 1;
          // if (inviter) {
          //   const inviterOfInviter =
          //     await this.doupiaopiaoInvitationEntity.findOneBy({
          //       userId: inviter.shareUserId.toString(),
          //     });
          //   if (inviterOfInviter && inviterOfInviter.shareUserLevel == 1) {
          //     user_level = 2;
          //   }
          // }
          const row = await this.doupiaopiaoInvitationEntity.findOneBy({
            userId: user.id.toString(),
            shareUserId: login.shareUserId,
          });

          if (row) {
            row.shareUserLevel = user_level;
            await this.doupiaopiaoInvitationEntity.save(row);
          } else {
            await this.doupiaopiaoInvitationEntity.save({
              userId: user.id.toString(),
              shareUserId: login.shareUserId,
              shareUserLevel: user_level,
            });
          }
        }
        user.nickName = userinfo.nickName;
        user.headImg = userinfo.headImg;

        await this.doupiaopiaoUserEntity.save(user);
      }

      if (!user) {
        user = await this.doupiaopiaoUserEntity.save({
          dyOpenid: douyinRes['openid'],
          dyUnionid: douyinRes['unionid'],
          nickName: userinfo.nickName,
          headImg: userinfo.avatarUrl,
          shareUserId: shareUserId ? shareUserId : 0,
        });
        if (login.shareUserId) {
          const inviter = await this.doupiaopiaoInvitationEntity.findOneBy({
            userId: shareUserId.toString(),
          });
          let user_level = 1;

          // if (inviter) {
          //   const inviterOfInviter =
          //     await this.doupiaopiaoInvitationEntity.findOneBy({
          //       userId: inviter.shareUserId.toString(),
          //     });
          //   if (inviterOfInviter && inviterOfInviter.shareUserLevel == 1) {
          //     user_level = 2;
          //   }
          // }
          await this.doupiaopiaoInvitationEntity.save({
            shareUserId: login.shareUserId,
            userId: user.id.toString(),
            shareUserLevel: user_level,
          });
        }
      }
      // 生成token
      const { expire, refreshExpire } = config.jwt.token;
      const result = {
        expire,
        token: await this.generateToken(user, expire),
        refreshExpire,
        refreshToken: await this.generateToken(user, refreshExpire, true),
      };
      // 将用户相关信息保存到缓存
      await this.cacheManager.set(
        `${config.name}:token:${user.id}`,
        result.token
      );
      await this.cacheManager.set(
        `${config.name}:token:refresh:${user.id}`,
        result.token
      );
      return result;
    } catch (error) {
      throw new CoolCommException('登录失败！');
    }
  }
  //淘宝登录
  async taobaoLogin(login) {
    console.log(login);
    const config = this.doupiaopiaoConfig;
    try {
      const user = await this.doupiaopiaoUserEntity.findOneBy({
        tbOpenid: login.openid,
      });

      if (!user) {
        // 用户不存在，创建新用户并保存信息
        await this.doupiaopiaoUserEntity.save({
          tbOpenid: login.openid,
          tbnickName: login.nitkame,
          tbheadImge: login.avatar,
        });
      } else {
        // 用户已存在，更新用户信息
        user.tbnickName = login.nitkame;
        user.tbheadImge = login.avatar;
        await this.doupiaopiaoUserEntity.save(user);
      }

      // 继续后续逻辑，生成Token等

      const userinfo = await this.doupiaopiaoUserEntity.findOneBy({
        tbOpenid: login.openid,
      });

      const { expire, refreshExpire } = config.jwt.token;
      const result = {
        expire,
        token: await this.generateToken(userinfo, expire),
        refreshExpire,
        refreshToken: await this.generateToken(userinfo, refreshExpire, true),
      };

      // 将用户相关信息保存到缓存
      await this.cacheManager.set(
        `${config.name}:token:${userinfo.id}`,
        result.token
      );
      await this.cacheManager.set(
        `${config.name}:token:refresh:${userinfo.id}`,
        result.token
      );

      return result;
    } catch (error) {
      console.log(error);

      throw new CoolCommException('登录失败！');
    }
  }
  /**
   * 生成token
   * @param user 用户对象
   * @param expire 过期
   * @param isRefresh 是否是刷新
   */
  async generateToken(user, expire, isRefresh?) {
    const config = this.doupiaopiaoConfig;
    await this.cacheManager.set(
      `${config.name}:passwordVersion:${user.id}`,
      user.passwordV,
      { ttl: expire }
    );
    const tokenInfo = {
      isRefresh: false,
      username: user.username,
      userId: user.id,
      passwordVersion: user.passwordV,
    };
    if (isRefresh) {
      tokenInfo.isRefresh = true;
    }
    return jwt.sign(tokenInfo, config.jwt.secret, {
      expiresIn: expire,
    });
  }

  // /**
  //  * 验证码
  //  * @param type 图片验证码类型 svg
  //  * @param width 宽
  //  * @param height 高
  //  */
  // async captcha(type: string, width = 150, height = 50) {
  //   const svg = svgCaptcha.create({
  //     ignoreChars: 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM',
  //     width,
  //     height,
  //   });
  //   const result = {
  //     captchaId: uuid(),
  //     data: svg.data.replace(/"/g, "'"),
  //   };
  //   // 文字变白
  //   const rpList = [
  //     '#111',
  //     '#222',
  //     '#333',
  //     '#444',
  //     '#555',
  //     '#666',
  //     '#777',
  //     '#888',
  //     '#999',
  //   ];
  //   rpList.forEach(rp => {
  //     result.data = result.data['replaceAll'](rp, '#fff');
  //   });
  //   if (type === 'base64') {
  //     result.data = svgToDataURL(result.data);
  //   }
  //   // 半小时过期
  //   await this.cacheManager.set(
  //     `verify:img:${result.captchaId}`,
  //     svg.text.toLowerCase(),
  //     { ttl: 1800 }
  //   );
  //   return result;
  // }

  // /**
  //  * 退出登录
  //  */
  // async logout() {
  //   const { userId } = this.ctx.admin;
  //   await this.cacheManager.del(`business:token:${userId}`);
  //   await this.cacheManager.del(`business:token:refresh:${userId}`);
  // }

  // /**
  //  * 检验图片验证码
  //  * @param captchaId 验证码ID
  //  * @param value 验证码
  //  */
  // async captchaCheck(captchaId, value) {
  //   const rv = await this.cacheManager.get(`verify:img:${captchaId}`);
  //   if (!rv || !value || value.toLowerCase() !== rv) {
  //     return false;
  //   } else {
  //     this.cacheManager.del(`verify:img:${captchaId}`);
  //     return true;
  //   }
  // }

  // /**
  //  * 生成token
  //  * @param user 用户对象
  //  * @param expire 过期
  //  * @param isRefresh 是否是刷新
  //  */
  // async generateToken(user, expire, isRefresh?) {
  //   await this.cacheManager.set(
  //     `business:passwordVersion:${user.id}`,
  //     user.passwordV,
  //     { ttl: expire }
  //   );
  //   const tokenInfo = {
  //     isRefresh: false,
  //     username: user.username,
  //     userId: user.id,
  //     passwordVersion: user.passwordV,
  //   };
  //   if (isRefresh) {
  //     tokenInfo.isRefresh = true;
  //   }
  //   return jwt.sign(tokenInfo, this.coolConfig.jwt.secret, {
  //     expiresIn: expire,
  //   });
  // }

  // /**
  //  * 刷新token
  //  * @param token
  //  */
  // async refreshToken(token: string) {
  //   try {
  //     const decoded = jwt.verify(token, this.coolConfig.jwt.secret);
  //     if (decoded && decoded['isRefresh']) {
  //       delete decoded['exp'];
  //       delete decoded['iat'];

  //       const { expire, refreshExpire } = this.coolConfig.jwt.token;
  //       decoded['isRefresh'] = false;
  //       const result = {
  //         expire,
  //         token: jwt.sign(decoded, this.coolConfig.jwt.secret, {
  //           expiresIn: expire,
  //         }),
  //         refreshExpire,
  //         refreshToken: '',
  //       };
  //       decoded['isRefresh'] = true;
  //       result.refreshToken = jwt.sign(decoded, this.coolConfig.jwt.secret, {
  //         expiresIn: refreshExpire,
  //       });
  //       await this.cacheManager.set(
  //         `business:passwordVersion:${decoded['userId']}`,
  //         decoded['passwordVersion'],
  //         { ttl: expire }
  //       );
  //       await this.cacheManager.set(
  //         `business:token:${decoded['userId']}`,
  //         result.token,
  //         { ttl: expire }
  //       );
  //       return result;
  //     }
  //   } catch (err) {
  //     console.log(err);
  //     this.ctx.status = 401;
  //     this.ctx.body = {
  //       code: RESCODE.COMMFAIL,
  //       message: '登录失效~',
  //     };
  //     return;
  //   }
  // }
}
